/**
 * Created by xuhenian on 2016/9/7.
 */
/**
 * 公共库类
 */
export = class Comm {

  /**
   * 推迟执行至 win.frameReady=true 时执行,
   * 否则将 call 保存在 win.frameReady 里待 callDelay 执行。
   * @param call 等待执行的函数或类
   * @param win frameReady 属性依附的对象,它应该是个全局变量,且要和 callDelay 里的 win 对应,可以是 window 或自定义对象，默认为 window。
   */
  static delayCall(call: any, win: any = window || {}) {
    if (!!win.frameReady) {//frame.js 已加载完毕。
      new call();
    } else {//frame.js 未运行完毕，保存此页面脚本执行入口至全局变量 frameReady
      win.frameReady = call;
    }
  }

  /**
   * 执行被推迟的函数,
   * 与 delayCall 对应使用
   * @param win
   */
  static callDelay(win: any = window || {}) {
    if(typeof win.frameReady === 'function'){
      new win.frameReady();
    }else {
      win.frameReady = true;
    }
  }

  /**
   * 解决类中的方法作为参数时 this 指向类本身。
   * @param method 类中的方法
   * @param scope method 中 this 指向的对象
   * @returns {Function} 返回一个代理函数
   */
  static methodProxy(method: Function, scope) {
    let arg = Array.prototype.slice.call(arguments, 2);
    return function () {
      return method.apply(scope, Array.prototype.slice.call(arguments, 0).concat(arg));
    }
  }
}
